Casper CBC: Adversary Oracle implementations
adversary_oracle.py
CAN_ESTIMATE: 0
ADV_ESTIMATE: 1 (攻撃者がこの値に変えたい, target値)
candidate_estimate:
view: finality検知者の知っている情報
view.latest_messages: dict
validator_set
recent_messages:
viewables: dict
viewables[v1][v2]: v1視点のv2
get_messages_and_viewables(self)
バリデータセットに属する全てのバリデータvに対して以下を調べる
if vがview.latest_messagesに含まれていない
vをadversasryとする
elif
else
val_latest_message: view.latest_messages[validator]
vはhonest
バリデータセットに属する全てのバリデータv2に対して以下を調べる
if v2がval_latest_message.justificationに含まれていない
v2はadversary
check_estimate_safety(self)
攻撃成功なら 0, 0 を返す
adversary_models/adversary.py (Adversary)
victim_estimate: consensus value をこの値にしたくない
target_estimate: consensus value をこの値にしたい
attack_view
validator_set
validator_models: dict
key: validator in validator_set
valude: ModelValidator
voting_against_attacker: set
voting_with_attacker: set
weight_of_victim_estimate
weight_of_target_estimate
is_attack_complete(self): 攻撃が成功したかどうか
weight_of_target_estimate > weight_of_victim_estimateかどうか
$ O(1)
ideal_network_attack(self)
攻撃者にとって理想的な攻撃を実行する
返り値: triple (was_attack_successful, operation_log, attack_view)
以下の処理を実行できるだけ行う
voting_against_attackerに属するバリデータv全てに対してmake_new_latest_bet()を試みる(target値に変えられるかどうか)
時間計算量$ O(V^3)
1回のループで少なくとも1つのノードが消されるのでwhileループは高々$ V回
whileループのforループの回数は$ O(V)回
forループ中のmake_new_latest_bet()が$ O(V)
adversary_models/model_bet.py (ModelBet)
sender
estimate
adversary_models/model_utils.py
get_estimate_from_latest_messages(latest_bets, default=None)
$ O(V)
return
0の重み > 1の重み: 0
0の重み < 1の重み: 1
0の重み == 1の重み: default (普通は target値)
adversary_models/model_validator.py (ModelValidator)
model_of
weight
my_latest_bet
target_estimate
latest_observed_bets
my_estimate(self)
latest_observed_betsからestimateを行う
$ O(V)
code:py
return model_utils.get_estimate_from_latest_messages(
self.latest_observed_bets,
self.target_estimate
)
make_new_latest_bet(self)
my_latest_bet.estimate
my_estimate()
$ O(V)